package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.BlogDao;
import com.itheima.dao.BlogSortDao;
import com.itheima.dao.BlogSortMapper;
import com.itheima.entity.PageResult;
import com.itheima.pojo.Blog;
import com.itheima.pojo.BlogSort;
import com.itheima.service.BlogService;
import com.itheima.service.BlogSortService;
import com.itheima.utils.DateUtils;
import com.itheima.utils.IdWorker;
import com.itheima.utils.UuidUtil;
import com.itheima.vo.BlogSortVO;
import com.itheima.vo.BlogVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.List;
import java.util.Map;

/**
 * @author Cici
 * @date 2020/7/12 9:37
 */
@Service
public class BlogSortServiceImpl implements BlogSortService {
    @Autowired
    IdWorker idWorker;

    @Autowired
    BlogSortDao blogSortDao;


    @Autowired
    BlogService blogService;

    @Autowired
    private BlogSortMapper blogSortMapper;

    @Autowired
    BlogDao blogDao;

    //添加博客分类
    @Override
    public void add(BlogSortVO blogSortVO) {
        //因为置顶权重为101,所有在添加和修改的时候权重不能大于100[前台做校验]
        if (blogSortVO.getSort() > 100) {
            throw new RuntimeException("权重设置的时候不可以大于100");
        }

        BlogSort blogSort = new BlogSort();
        //blogSort.setUid(String.valueOf(new IdWorker().nextId()));
        blogSort.setUid(UuidUtil.getUuid());
        blogSort.setSortName(blogSortVO.getSortName());
        blogSort.setContent(blogSortVO.getContent());
        blogSort.setCreateTime(DateUtils.getNowTime());
        blogSort.setUpdateTime(DateUtils.getNowTime());
        blogSort.setStatus(1);
        blogSort.setSort(blogSort.getSort());
        blogSort.setClickCount(0);

        blogSortDao.insertSelective(blogSort);
    }

    //通过引用量排序博客分类
    @Override
    public List<BlogSort> blogSortByCite() {
        PageHelper.startPage(1,10);
        List<BlogSort> blogSorts = blogSortDao.selectSortByCite();
        return blogSorts;
    }

    //通过点击量排序博客分类
    @Override
    public List<BlogSort> blogSortByClickCount() {
        PageHelper.startPage(1,10);
        return blogSortDao.selectSortByClickCount();
    }

    //批量删除博客分类
    @Override
    public void deleteBatch(BlogSortVO blogSortVO) {
        String uids = blogSortVO.getUid();
        String[] split = uids.split(",");
        if (split != null && split.length > 0) {
            for (String s : split) {
                BlogSort blogSort = new BlogSort();
                blogSort.setUid(s);
                blogSort.setUpdateTime(DateUtils.getNowTime());
                blogSort.setStatus(0);
                blogSortDao.updateByPrimaryKeySelective(blogSort);
            }
        }
    }

    //编辑博客分类
    @Override
    public void edit(BlogSortVO blogSortVO) {
        //因为置顶权重为101,所有在添加和修改的时候权重不能大于100[前台做校验]
        if (blogSortVO.getSort()>100){
            throw new RuntimeException("权重设置的时候不可以大于100");
        }

        //获取前台传来的uid
        BlogSort blogSort = new BlogSort();
        blogSort.setUid(blogSortVO.getUid());
        blogSort.setSortName(blogSortVO.getSortName());
        blogSort.setContent(blogSortVO.getContent());
        blogSort.setUpdateTime(DateUtils.getNowTime());

        blogSortDao.updateByPrimaryKeySelective(blogSort);
    }

    //置顶分类
    @Override
    public List<BlogSort> stick(BlogSortVO blogSortVO) {
        BlogSort blogSort = new BlogSort();
        //将权重设置为最大
        blogSort.setSort(101);
        blogSort.setUid(blogSortVO.getUid());
        blogSort.setUpdateTime(DateUtils.getNowTime());
        blogSortDao.updateByPrimaryKeySelective(blogSort);
        //调用查询所有方法
        return this.getList(blogSortVO);
    }

    //获取博客分类列表
    @Override
    public List<BlogSort> getList(BlogSortVO blogSortVO) {
        //获取分页信息
        Integer page = blogSortVO.getCurrentPage();
        if (page==null||page==0){
            page=1;
        }
        Integer size = blogSortVO.getPageSize();
        if (page==null||page==0){
            size=10;
        }
        PageHelper.startPage(page,size);

        Example example = createExample(blogSortVO);
        return (Page<BlogSort>) blogSortDao.selectByExample(example);
    }

    /**
     * 构建查询对象
     * @param blogSortVO
     * @return
     */
    private Example createExample(BlogSortVO blogSortVO) {
        Example example = new Example(BlogSort.class);
        Example.Criteria criteria = example.createCriteria();
        if (blogSortVO != null) {
            // 关键字
            if (blogSortVO.getKeyword()!= null && !"".equals(blogSortVO.getKeyword())) {
                criteria.andLike("sortName", "%" + blogSortVO.getKeyword() + "%");
            }
            //状态为1的才显示
            criteria.andEqualTo("status",1);
            //按权重排序
            example.setOrderByClause("SORT DESC");
        }
        return example;
    }


    /**
     * 根据blogSortUid 获取分类文章
     *
     * @param blogSortUid
     * @param currentPage
     * @param pageSize
     */
    @Override
    public Page<Blog> getArticleByBlogSortUid(String blogSortUid, Integer currentPage, Integer pageSize) {

        BlogVo blogVO = new BlogVo();

        if (currentPage == null || currentPage == 0) {
            blogVO.setCurrentPage(1);
        }
        if (pageSize == null || pageSize == 0) {
            blogVO.setCurrentPage(10);
        }
        PageHelper.startPage(currentPage, pageSize);

        //查询条件构造
        Example example = new Example(Blog.class);
        Example.Criteria criteria = example.createCriteria();
        //状态为1的才可以被查询到
        criteria.andEqualTo("status", 1);
        criteria.andEqualTo("blogSortUid", blogSortUid);

        return (Page<Blog>) blogDao.selectByExample(example);
    }

    /**
     * 获取博客分类列表 根据条件进行分页查询
     * @param keyword
     * @param currentPage
     * @param pageSize
     * @return
     */
    @Override
    public PageResult findAll(String keyword, Integer currentPage, Integer pageSize) {
        PageHelper.startPage(currentPage, pageSize);
        List<Map> mapList = blogSortMapper.findAllByKeyword(keyword);

        PageResult pageResult = new PageResult();
        pageResult.setRecords(mapList);
        pageResult.setTotal((long) mapList.size());
        pageResult.setCurrent(currentPage);
        pageResult.setSize(pageSize);
        return pageResult;
    }
}
